package com.xrtn.service;

import com.xrtn.bean.*;
import com.xrtn.page.Page;
import com.xrtn.utils.*;
import org.apache.commons.lang.StringEscapeUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by tu_pei on 2018/2/27.
 */
public interface ICommonService {
    /**
     * 后台统计
     *
     * @param params
     * @return
     */
    Map<String, Object> selectSysDesktop(Map<String, Object> params);

    /**
     * 保存用户
     *
     * @param userInfo
     * @return
     */
    Integer saveUserInfo(TUserInfo userInfo);

    /**
     * 修改
     *
     * @param userInfo
     * @return
     */
    Integer updateUserInfo(TUserInfo userInfo);

    TUserInfo updateUserSendCode(Integer userId, String userPhone);
    /**
     * 根据用户id获取患者列表
     *
     * @param userId
     * @return
     */
    List<TPatientInfo> selectPatientListByUserId(Integer userId);
    /**
     * 修改预约详情
     * @return
     */
    Integer updateBookingInfo(TBookingInfo bookingInfo,String patientName,String patientBirthday,Integer patientGender);

    TSubclinicInfo selectSubclinicInfoByKey(Integer subId);

    /**
     * 新增患者信息
     *
     * @param record
     * @return
     */
    int insertTPatientInfoSelective(TPatientInfo record);

    /**
     * 调查问卷表单
     *
     * @param diseaseArray
     * @return
     */
    int saveDiseaseList(String diseaseArray);
    /**
     * 调查问卷表单
     *
     * @param params
     * @return
     */
    List<TPatientInfo> selectPatient(Map<String,Object> params);

    /**
     * 新增患者调查记录表
     *
     * @param record
     * @return
     */
    int insertTPatientInitSelective(TPatientInit record);

    /**
     * 后台新增患者和病历信息
     * @param patientInit
     * @param bookingInfo
     * @param bookingName
     * @param bookingPhone
     * @param bookingPhones
     * @param patientHistory
     * @param userId
     * @return
     */
    Map<String,Object> insertSysTPatientInitSelective(TPatientInit patientInit,TBookingInfo bookingInfo, String bookingName,String bookingPhone,
                                       String bookingPhones,
                                       TPatientHistory patientHistory,Integer userId);

    /**
     * 修改患者调查记录表
     *
     * @param record
     * @return
     */
    int updateTPatientInitSelective(TPatientInit record);

    /**
     * 修改患者调查记录表
     *
     * @param record
     * @return
     */
    int updateTPatientInfoSelective(TPatientInfo record);

    /**
     * 查询患者调查记录表
     *
     * @param params
     * @return
     */
    Map<String, Object> selectTPatientInitByMap(Map<String, Object> params);
    /**
     * 查询患者信息表
     *
     * @param patientId
     * @return
     */
    TPatientInfo selectTPatientInfo(Integer patientId);

    /**
     * 保存调查问卷调查
     *
     * @return
     */
    Integer saveDoctorPush(TDoctorPushRel doctorPushRel);

    /**
     * 根据患者id获取患者历史病历
     *
     * @param patientId
     * @return
     */
    TPatientHistory selectPatientHistoryByPatientId(Integer patientId);

    /**
     * 根据患者id获取患者历史病历
     *
     * @param patientId
     * @return
     */
    List<Map<String, Object>> selectPatientTreatmentList(Integer patientId);

    /**
     * 根据患者id获取患者历史病历
     * @param params
     * @return
     */
    TPatientTreatment selectPatientTreatmentInfo(Map<String,Object> params);
    /**
     * 根据患者id修改患者历史病历
     *
     * @param record
     * @return
     */
    int updatePatientHistorySelective(TPatientHistory record);

    Map<String,Object> selectPatientInitMap(Map<String,Object> params);
    /**
     * 新增患者历史病历
     *
     * @param record
     * @return
     */
    int insertPatientHistorySelective(TPatientHistory record);

    /**
     * 获取患者就诊记录
     *
     * @return
     */
    List<Map<String,Object>> selectPatientList(Map<String,Object> params);

    /**
     * 查询家庭护理表
     *
     * @param patientId
     * @return
     */
    List<TUserNersingRel> selectHomeNursingList(Integer patientId);

    /**
     * 查询症状列表
     *
     * @return
     */
    List<InitDiseaseType> selectDiseaseTypeList();

    /**
     * 根据类型查询症状程度列表
     *
     * @return
     */
    List<InitDiseaseInfo> selectDiseaseInfoList(Integer typeId);

    /**
     * 穴位分组list
     *
     * @return
     */
    List<Map<String, Object>> selectPointGroupList();

    /**
     * 查询推拿服务列表
     *
     * @return
     */
    List<InitServiceInfo> selectInitServiceList(Integer userId,Integer state, String serviceName);

    /**
     * 查询药品列表
     *
     * @return
     */
    List<InitGoodsInfo> selectInitGoodsList(Integer state,String goodsName);

    /**
     * 保存技师请假
     *
     * @return
     */
    Integer saveDoctorOff(TOffInfo offInfo);

    /**
     * 撤销技师请假
     *
     * @return
     */
    Integer deleteDoctorOff(TOffInfo offInfo);

    /**
     * 获取门店列表
     *
     * @param params
     * @return
     */
    List<TSubclinicInfo> selectSubclinicList(Map<String, Object> params);

    /**
     * 获取技师列表
     *
     * @param params
     * @return
     */
    List<SysUserInfo> selectSysUserList(Map<String, Object> params);

    /**
     * 获取用户最大number
     * @return
     */
    Integer selectUserMaxNo();

    /**
     * 获取技师列表
     *
     * @param params
     * @return
     */
    List<TUserInfo> selectUserList(Map<String, Object> params);

    /**
     * 获取用户优惠券列表
     *
     * @param params
     * @return
     */
    List<Map<String, Object>> selectUserDiscountList(Map<String, Object> params);

    /**
     * 新增预约
     *
     * @return
     */
    TBookingInfo saveBookingInfo(TBookingInfo bookingInfo, TPatientInfo patientInfo);
    /**
     * 新增预约
     *
     * @return
     */
    Map<String,Object>  saveBookingInfo(TBookingInfo bookingInfo);
    /**
     * 修改预约
     *
     * @return
     */
    Map<String,Object>  updateBooking(TBookingInfo bookingInfo);
    /**
     * 新增预约
     * @return
     */
    List<Map<String, Object>> selectFreeDoctor(String bookingTime, Integer subclinicId);
    /**
     * 后台 ： 查询预约列表
     *
     * @return
     */
    List<Map<String, Object>> selectBookingList(Map<String, Object> params);
    /**
     * 后台 ： 查询预约列表 - 分页
     *
     * @return
     */
    Page selectBookingPageList(Page page,Map<String, Object> params);
    /**
     * 查询预约看板按周分组
     * @param params
     * @return
     */
    Map<String, Object> selectBookingWeekList(Map<String,Object> params);

    /**
     * 查询预约统计信息
     * @param params
     * @return
     */
    Map<String, Object> selectBookingStatInfo(Map<String,Object> params);

    /**
     * 后台 ： 查询预约列表
     *
     * @return
     */
    TBookingInfo selectBookingByPrimaryKey(Integer bookingId);

    /**
     * 后台 ： 查询预约看板
     *
     * @return
     */
    Map<String, Object> selectBookingBoardList(Map<String, Object> params);

    /**
     * 后台 ： 查询商品消耗统计
     *
     * @return
     */
    List<Map<String, Object>> selectGoodsStatic(Map<String, Object> params);

    /**
     * 后台 ： 查询预约列表
     *
     * @return
     */
    SysUserInfo selectSysUserInfo(Map<String, Object> params);

    /**
     * 后台 ： 查询储值卡||计次卡列表
     *
     * @return
     */
    List<SysAccountCardInfo> selectSysCardList(Map<String, Object> params);

    /**
     * 后台 ： 优惠券列表
     *
     * @return
     */
    List<SysDiscountCardInfo> selectSysDiscountCardList(Map<String, Object> params);

    /**
     * 后台 ： 查询用户计次卡列表
     *
     * @return
     */
    List<TCardUsrRel> selectUserCardList(Map<String, Object> params);

    /**
     * 后台 ： 查询储值卡||计次卡列表
     *
     * @return
     */
    SysAccountCardInfo selectSysCardInfo(Integer cardId);

    /**
     * 后台 ： 优惠券列表
     *
     * @return
     */
    SysDiscountCardInfo selectSysDiscountCardInfo(Integer cardId);

    /**
     * 后台 ： 新增储值卡||计次卡列表
     *
     * @return
     */
    Integer saveSysAccountCardInfo(SysAccountCardInfo accountCardInfo);

    /**
     * 后台 ： 修改储值卡||计次卡列表
     *
     * @return
     */
    Integer updateSysAccountCardInfo(SysAccountCardInfo accountCardInfo);

    /**
     * 后台 ： 新增优惠券
     *
     * @return
     */
    Integer saveSysDiscountCardInfo(SysDiscountCardInfo discountCardInfo, HttpServletRequest request);

    /**
     * 后台 ： 修改优惠券
     *
     * @return
     */
    Integer updateSysDiscountCardInfo(SysDiscountCardInfo discountCardInfo);

    /**
     * 后台 ： 删除优惠券
     *
     * @return
     */
    Integer deleteSysDiscountCardInfo(Integer cardId);

    /**
     * 后台 ： 删除优惠券
     *
     * @return
     */
    Integer deleteSysAccountCardInfo(Integer cardId);

    /**
     * 用户开卡
     * @param cardId
     * @param userId
     * @return
     */
    Integer saveUserCard(Integer cardId,Integer userId,Integer cardType,Integer doctorId,Integer sub,Integer payWay, String cardDesc);

    /**
     * 发放优惠券
     * @param userCouponArray
     * @return
     */
    Integer saveUserCoupon(String userCouponArray);
    /**
     * 发放优惠券
     * @param couponUsrRel
     * @return
     */
    Integer saveUseCoupon(TCouponUsrRel couponUsrRel);
    /**
     * 发放优惠券
     * @return
     */
    ResponseData saveUseCoupon(Integer couponId, String userPhone,ResponseData data);
    /**
     * 查询未领券的用户列表
     * @param params
     * @return
     */
    List<Map<String,Object>> selectUnUseCouponList(Map<String,Object> params);

    /**
     * 新增推拿服务
     *
     * @param serviceInfo
     * @return
     */
    Integer saveServiceInfo(InitServiceInfo serviceInfo);

    /**
     * 查询推拿服务
     *
     * @return
     */
    InitServiceInfo selectServiceInfo(Integer serviceId);

    /**
     * 修改推拿服务
     *
     * @param serviceInfo
     * @return
     */
    Integer updateServiceInfo(InitServiceInfo serviceInfo);

    /**
     * 新增商品 || 药品
     *
     * @param goodsInfo
     * @return
     */
    Integer saveGoodsInfo(InitGoodsInfo goodsInfo);

    /**
     * 查询商品 || 药品
     *
     * @return
     */
    InitGoodsInfo selectGoodsInfo(Integer goodsId);

    /**
     * 修改商品 || 药品
     *
     * @return
     */
    Integer updateGoodsInfo(InitGoodsInfo goodsInfo);

    /**
     * 新增门店信息
     *
     * @return
     */
    Integer saveSubclinic(TSubclinicInfo subclinicInfo);

    /**
     * 修改门店信息
     *
     * @return
     */
    Integer updateSubclinic(TSubclinicInfo subclinicInfo);

    /**
     * 查询诊断结论列表
     *
     * @return
     */
    List<InitConclusionInfo> selectInitConclusionList();

    /**
     * 添加退卡
     */
    Integer saveBackCardInfo(TBackcardInfo backcardInfo);

    /**
     * 查询退款详情
     * @param backcardInfo
     * @return
     */
    Map<String,Object> selectBackCardInfo(TBackcardInfo backcardInfo);

    /**
     * 查询退款列表
     * @param params
     * @return
     */
    List<TBackcardInfo> selectBackCardInfoList(Map<String, Object> params);
    /**
     * 修改退卡记录
     */
    Integer updateBackCardInfo(Map<String,Object> params);

    /**
     * 查询消耗商品列表
     */
    List<Map<String,Object>> selectGoodsList(int subclinicId, int ifMonth, String orderTime);

    /**
     * 查询消耗商品列表详情
     */
    List<Map<String,Object>> selectGoodsListDetail(int subclinicId, int ifMonth, String orderTime);

    /**
     * 设置店长
     *
     * @param subclinicId
     * @param ownerId
     * @return
     */
    int updateOwner(int subclinicId, int ownerId);

    List<InitGradeDoctor> selectDoctorGradeList();

    /**
     * 查询卡项列表
     * @return
     */
    List<Map<String,Object>> selectAccountList(Map<String,Object> params);

    /**
     * 查询过期预约单号
     * @return
     */
    List<TBookingInfo> selectOverBooking(Map<String,Object> params);

    /**
     * 查询过期病历
     * @return
     */
    List<TPatientTreatment> selectOverTreatment(Map<String,Object> params);

    /**
     * 更新过期预约单号
     * @return
     */
    Integer updateBookingInfo(TBookingInfo bookingInfo);

    /**
     * 更新过期病历
     * @return
     */
    Integer updateTreatment(TPatientTreatment treatment);

    /**
     * 获取用户来源
     * @return
     */
    List<InitFromInfo> selectInitFromAll();

    /**
     * 获取标签
     * @return
     */
    List<InitLabelInfo> selectInitLabelAll(Map<String,Object> params);

    /**
     * 删除宝宝，若该宝宝没有已完成订单，将删除该宝宝下的预约记录等相关信息。否则将无法删除。
     * @param patientId
     * @return 状态码
     */
    Integer deletePatientInfo(Integer patientId);

    /**
     * 删除宝宝，若该宝宝没有已完成订单，将删除该宝宝下的预约记录等相关信息。否则将无法删除。
     * @param relId
     * @return 状态码
     */
    Integer deleteUserCardInfo(Integer relId);

    void addUserCodeItem(UserCode userCode);

    public void importExcelAccount() throws Exception;

    /**
     * 取消预约给客户发微信推送，给大夫发短信提醒
     * @param bookingInfo
     */
    public static void cancleBookingPushAndMessage(TBookingInfo bookingInfo, TUserInfo userInfo, SysUserInfo sysUserInfo, TSubclinicInfo subclinicInfo, TPatientInfo patient) {

        // 给用户发微信推送
        String bookingTime = DateUtils.format(bookingInfo.getBookingTime(),DateUtils.YYYY_MM_DD_HH_MM_SS);
        if(ObjUtils.isNotEmpty(userInfo.getOpenId())){
            Map<String, String> param = new HashMap<>();
            param.put("openId", userInfo.getOpenId());
            param.put("doctorName", sysUserInfo.getUserName());
            param.put("bookingTime", bookingTime);
            param.put("subclinicName", subclinicInfo.getSubclinicName());
            param.put("orderNo", bookingInfo.getBookingNo());
            String str = HttpUtils.submitPostData("http://wechat.xrtn.dmpp.net.cn/children/frontend/web/index.php?r=wechat/sendcancelbooking", param,"utf-8");
            System.out.println("str = " + str);
        }

        // 给大夫发取消预约短信提醒
        HashMap<String, Object> result = SendValidataCode.restAPI.sendTemplateSMS(sysUserInfo.getUserPhone(), "336470",
                new String[]{patient.getPatientName(), bookingTime});
        System.out.println("msgResult = " + result);
    }

}
